import shutil
import os

import os
from typing import List
from pathlib import Path
from typing import List

def find_video_files(root_dir: str, extensions: tuple = ('.mp4', '.avi')) -> List[str]:
    """
    递归查找指定目录下的视频文件
    
    :param root_dir: 要搜索的根目录路径
    :param extensions: 要查找的文件扩展名元组，默认查找.mp4和.avi
    :return: 包含符合条件文件完整路径的列表
    """
    video_files = []
    
    # 添加路径存在性校验
    if not os.path.exists(root_dir):
        raise ValueError(f"指定路径不存在: {root_dir}")
    if not os.path.isdir(root_dir):
        raise NotADirectoryError(f"指定路径不是目录: {root_dir}")

    try:
        # 使用os.walk递归遍历目录
        for dirpath, dirnames, filenames in os.walk(root_dir):
            for filename in filenames:
                # 分离文件扩展名并转换为小写
                file_ext = os.path.splitext(filename)[1].lower()
                if file_ext in extensions:
                    # 拼接完整路径
                    full_path = os.path.abspath(os.path.join(dirpath, filename))
                    video_files.append(full_path)
    except PermissionError as e:
        print(f"权限拒绝，跳过目录: {e.filename}")
    except Exception as e:
        print(f"发生未知错误: {str(e)}")
    
    return video_files

def move_file_to_folder(source_file_path, target_folder):
    """
    将指定文件移动到目标文件夹（保留原文件名）
    
    :param source_file_path: 要移动文件的完整路径（如：D:/data/file.txt）
    :param target_folder: 目标文件夹路径（如：E:/backup）
    :return: 移动成功返回True，失败返回False
    """
    try:
        # 检查源文件是否存在
        if not os.path.isfile(source_file_path):
            raise FileNotFoundError(f"源文件不存在: {source_file_path}")

        # 创建目标文件夹（如果不存在）
        os.makedirs(target_folder, exist_ok=True)

        # 构造目标路径（保留原文件名）
        file_name = os.path.basename(source_file_path)
        destination_path = os.path.join(target_folder, file_name)

        # 执行移动操作
        shutil.move(source_file_path, destination_path)
        print(f"文件移动成功: {source_file_path} -> {destination_path}")
        return True

    except FileNotFoundError as e:
        print(f"错误: {str(e)}")
    except PermissionError:
        print(f"权限拒绝，请检查文件访问权限: {source_file_path}")
    except Exception as e:
        print(f"发生未知错误: {str(e)}")
    
    return False

# 使用示例
if __name__ == "__main__":
    # 指定要搜索的目录（替换为实际路径）
    search_directory = "F:\\test"
    # 目标文件夹路径（需要修改为实际路径）
    target_dir = "F:\\dest"
    
    try:
        # 获取视频文件列表
        video_list = find_video_files(search_directory)
        
        # 打印结果
        print(f"找到 {len(video_list)} 个视频文件:")
        for idx, path in enumerate(video_list, 1):
            print(f"{idx}. {path}")
    except (ValueError, NotADirectoryError) as e:
        print(f"输入错误: {str(e)}")

    # 原始文件路径（需要修改为实际路径）
    # source_file = "F:\\test\\海报掉落视频.avi"
    for file in video_list:
        # print(file)
        # print(type(file))
        # 执行移动操作
        move_file_to_folder(file, target_dir)
    
    